package com.jackstraw.jack_base.util.exception;


import com.jackstraw.jack_base.util.SpringUtil;
import com.jackstraw.jack_base.util.StringUtil;
import org.springframework.core.env.Environment;

/**
 * 异常信息工具类
 */
public class ExceptionUtil {
    /**
     * 环境变量
     */
    private static Environment env;
    /**
     * 错误信息描述的数组长度
     */
    private static int describeLength = 2;

    /**
     * 对象创建方法
     *
     * @return
     */
    private static Environment getInstance() {
        if (env == null) {
            env = SpringUtil.getBean(Environment.class);
        }
        return env;
    }


    /**
     * 获取错误
     *
     * @param key
     * @return
     */
    public static String[] getError(String key) {
        String obj = getInstance().getProperty(key);
        String[] val = StringUtil.null2Str(obj).split("->");

        return val;
    }


    /**
     * 获取错误码
     *
     * @param key
     * @return
     */
    public static String getErrCode(String key) {
        String code = analiseError(0, key, true);
        if (code != null) {
            return code;
        } else {
            return "-1";
        }
    }

    /**
     * 获取错误信息
     *
     * @param key
     * @return
     */
    public static String getErrMsg(String key) {
        return analiseError(1, key, false);
    }

    /**
     * 获取错误信息
     *
     * @param key
     * @param obj
     * @return
     */
    public static String getErrMsg(String key, Object... obj) {
        String message = StringUtil.null2Str(analiseError(1, key, false));
        message = StringUtil.placeholderAnalysis(message, obj);
        return message;
    }

    /**
     * 解析错误信息
     *
     * @param idx
     * @param key
     * @param code
     * @return
     */
    private static String analiseError(int idx, String key, boolean code) {
        String obj = getInstance().getProperty(key);
        String[] val = StringUtil.null2Str(obj).split("->");
        if (val.length == describeLength) {
            return val[idx];
        }
        if (code) {
            return null;
        }
        return key;
    }

}
